package logs;

import exceptions.Exception;
import java.util.Date;

/**
 * Klasa logu.
 * Stanowi wzór jednostek, z których składa się pełen raport logów zapisywany do pliku,
 * a reprezentowany przez klasę Logger.
 * 
 * @author mmskrzyp
 * @todo ustalic jak bedzie wyglądał pojedynczy log
 * @todo ustalic jak bedzie konwertowal wyjątki/wiadomości
 * @todo typy logów do enuma
 */
public final class Log {
    private String text;
    private Date date;
    private LogType type;
    
    /**
     * Metoda pobiera tekst i typ loga (nie wiem po co) i zapisuje je we właściwościach
     * obiektu
     * @param text tekst będący właściwą częścią loga
     * @param lt typ logowanego obiektu
     */
    private void setUp(String text, LogType lt) {
        this.text = text;
        date= new Date(System.currentTimeMillis());
        this.type = lt;
    }

    /**
     * Kontruktor przyjmuje jako parametr wyjątek i wyciąga z niego toString()
     * @param e wyjątek do zalogowania
     */
    public Log(Exception e) {
        this.setUp(e.toString(), LogType.ERROR);
    }
    
    /**
     * Kontruktor tworzy log o zwyłkłym tekscie
     * @param t tekst do zalogowania
     */
    public Log(String t) {
        this.setUp(t, LogType.INFO);
    }
    
    
    /**
     * Najbardziej ogólny kostruktor, przyjmuje dowolny tekst do zalogowania - 
     * może to być dowolna klasa z metodą toString().
     * Przyjmuje też parametr typu loga
     * @see LogType
     * @param ob obiekt zo zalogowania
     * @param lt LogType typ logowanego obiektu
     */
    public Log(String ob, LogType lt){
        this.setUp(ob, lt);
    }
    
    public Date getDate() {
        return date;
    }

    public String getText() {
        return text;
    }

    public String getType() {
        return type.toString();
    }
    
    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();        
        if(type == LogType.ERROR)
            sb.append("[Wyjątek]");
        else if (type == LogType.DEBUG)
            sb.append("[Debug]");
        else
            sb.append("[TEXT]");
        sb.append(" (").append(date).append(") ").append(text);                
        return sb.toString();
    }
}
